home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 12: Textmags & Docs / nf_archive_12.iso / MAGS / SOURCES / ATARI_SRC.ZIP / atari source / AHDI / CHNLTST / CHNLTST.S < prev    next >
Encoding:
Text File  |  2001-02-09  |  15.2 KB  |  557 lines

  1. ;+
  2. ; CHNLTST.C - test Sparrow SDMA and BLiTTER by accessing them simultaneously.
  3. ;
  4. ; Apr-09-92 ml.        Started this.
  5. ;            (Sound stuff adapted from LT's looptst.c)
  6. ;-
  7. .include    "defs.h"
  8. .include    "sound.h"
  9. .include    "sysvar.h"
  10. .include    "spscsi.h"
  11. .include    "blitter.h"
  12.  
  13. .extern    _hread, _hwrite, _readcap
  14. .extern _cachexst
  15. .extern    _active, _awto, _sbwto
  16.  
  17. STACKSIZE   equ        $2000
  18. HEAPSIZE    equ        $8000
  19. NSECTS        equ        MAXACSECTS
  20.  
  21. IDLETM        equ        12        ; spin IDE down every 60 seconds
  22. NTICKS        equ        12400    ; spin IDE up every 62 seconds
  23.  
  24.  
  25.     bra    sttst
  26.  
  27.         .globl  _spscsixst
  28. _spscsixst: dc.b    1        ; 1: Sparrow SCSI exists
  29.         .globl  blit
  30. blit:        dc.b    1        ; 1: do BLiT test
  31. badblit:    dc.b    0        ; 1: error in BLiT test
  32. manual:        dc.b    0        ; 1: we turned BLiT test off
  33. rw:        dc.b    1        ; 1: do read/write test
  34.         .globl  _useblit
  35. _useblit:   dc.b    0        ; 0: no IDE BliT involved
  36.         .globl  idespin
  37. idespin:    dc.b    1        ; 1: do IDE spin-up spin-down
  38. .even
  39. bsbuf:        dcb.l   128,0    ; BLiT source buffer
  40. bdbuf:        dcb.l   128,0    ; BLiT destination buffer
  41. .even
  42. savssp:        dc.l    0        ; system stack pointer
  43. timestamp:  dc.l    0        ; time recorder
  44. ssect:        dc.l    0        ; starting sector number
  45. bigrbuf:    dc.l    0        ; address of read buffer
  46. bigwbuf:    dc.l    0        ; address of write buffer
  47. basepage:   dc.l    0        ; basepage address
  48.  
  49. cmd:        dc.b    13,10
  50.         dc.b    'ESC - quit      h - help',13,10
  51.         dc.b    10
  52.         dc.b    'Sound controls:',13,10
  53.         dc.b    '  r - sound from RASCAL (2 tracks)',13,10
  54. ;        dc.b    '  o - sound from connector (10 tracks)',13,10
  55.         dc.b    '  d - disable sound test',13,10
  56.         dc.b    '  e - enable sound test',13,10
  57.         dc.b    10
  58.         dc.b    'BLiTTER controls:',13,10
  59.         dc.b    '  n - disable BLiTTER test',13,10
  60.         dc.b    '  b - enable BLiTTER test',13,10
  61.         dc.b    10
  62.         dc.b    'SCSI Read-Write controls:',13,10
  63.         dc.b    '  q - disable SCSI Read-Write test',13,10
  64.         dc.b    '  w - enable SCSI Read-Write test',13,10
  65.         dc.b    10
  66.         dc.b    'IDE spin-down spin-up controls:',13,10
  67.         dc.b    '  s - disable the drive from spinning up',13,10
  68.         dc.b    '  u - enable the drive to spin up',13,10
  69.         dc.b    0
  70.  
  71. help:        dc.b    'Type \'h\' for help',13,10,0
  72.  
  73. ;+
  74. ; Error messages
  75. ;-
  76. e_nomem:    dc.b    'Not enough memory',13,10,0
  77. e_cap:        dc.b    'Cannot get SCSI unit 0 disk capacity',13,10,0
  78. e_rwcmp:    dc.b    'Read-Write comparison error',13,10,0
  79. e_read:        dc.b    'Read from SCSI hard disk failed',13,10,0
  80. e_write:    dc.b    'Write to SCSI hard disk failed',13,10,0
  81. e_blit:        dc.b    'BLiT comparison error',13,10,0
  82.  
  83. .even
  84. sttst:    move.l    4(sp),a0    ; get the basepage address
  85.     move.l    a0,basepage    ; save it
  86.     move.l    $18(a0),a1    ; bss base address from basepage
  87.     adda.l    $1c(a0),a1    ; + bss size
  88.     adda.l    #STACKSIZE,a1    ; + stack
  89.     adda.l    #HEAPSIZE,a1    ; + heap; a1 -> new top
  90.     move.l    a1,sp        ; move stack to top of new TPA
  91.     suba.l    basepage,a1    ; new TPA size
  92.     move.l    a1,-(sp)    ; new size after Mshrink()
  93.     move.l    basepage,-(sp)    ; starting from basepage
  94.     clr.w    -(sp)
  95.     move.w    #$4a,-(sp)    ; Mshrink(0, basepage, TPAsize)
  96.     trap    #1
  97.     adda.w    #12,sp        ; clean up stack
  98.  
  99.     clr.l    -(sp)        ; go into Super mode
  100.     move.w    #$20,-(sp)    ; Super(0L)
  101.     trap    #1
  102.     addq.w    #6,sp        ; clean up stack
  103.     move.l    d0,savssp    ; save system stack pointer
  104.  
  105.     st    _cachexst    ; assume cache exists
  106.  
  107.     move.l    #cmd,-(sp)    ; print commands usage
  108.     bsr    prnstr
  109.     addq.w    #4,sp        ; clean up stack
  110.  
  111.     move.w    #IDLETM,-(sp)    ; set IDE 0 to Active mode with timeout
  112.     move.w    #$10,-(sp)
  113.     bsr    _sbwto
  114.     addq.w    #4,sp        ; clean up stack
  115.     move.l    _hz_200,timestamp   ; record the time
  116.  
  117.     bsr    sndsetup    ; set up sound registers and start sound loop
  118.  
  119.                 ; fill buffer for BLiT test
  120.     movea.l    #bsbuf,a0    ; a0 -> BLiT test source buffer
  121.     moveq    #0,d0
  122.     move.w    #511,d2        ; a total of 512 bytes
  123. fbsbuf:
  124.     move.b    d0,(a0)+
  125.     addq.b    #1,d0
  126.     dbra    d2,fbsbuf
  127.  
  128.                 ; set up hard disk transfers
  129.     move.l    #(2*NSECTS*512),-(sp)
  130.     move.w    #$48,-(sp)    ; Malloc(NSECTS*2 sectors)
  131.     trap    #1
  132.     addq.w    #6,sp        ; clean up stack
  133.     move.l    d0,bigrbuf    ; bigrbuf -> read buffer
  134.     bne.s    fillbuf
  135.     move.l    #e_nomem,-(sp)    ; print error message
  136.     bsr    prnstr
  137.     addq.w    #4,sp        ; clean up stack
  138. w2quit:    move.w    #2,-(sp)    ; console
  139.     move.w    #1,-(sp)    ; Bconstat(CON)
  140.     trap    #13
  141.     addq.w    #4,sp        ; clean up stack
  142.     tst.w    d0        ; any character available?
  143.     beq    w2quit        ; if not, wait some more
  144.     bra    endtst        ; else, quit
  145.  
  146. fillbuf:
  147.     add.l    #(NSECTS*512),d0
  148.     move.l    d0,bigwbuf    ; bigwbuf -> write buffer
  149.                 ; fill write buffer with test pattern
  150.     movea.l    d0,a0        ; a0 -> write buffer
  151.     moveq    #0,d0        ; pattern starts with zero
  152.     move.w    #NSECTS-1,d1    ; altogether NSECTS sectors
  153. fnxts:    move.w    #511,d2        ; 512 bytes per sector
  154. fnxtb:    move.b    d0,(a0)+
  155.     addq.b    #1,d0
  156.     dbra    d2,fnxtb    ; fill next byte
  157.     dbra    d1,fnxts    ; fill next sector
  158.  
  159.                 ; find capacity of hard disk
  160.  
  161. ;    move.w    #8,-(sp)    ; SCSI unit 0
  162. ;    move.l    #bdbuf,-(sp)    ; buffer
  163. ;    move.w    #1,-(sp)    ; 1 sector
  164. ;    clr.l    -(sp)        ; sector 0
  165. ;    bsr    _hread        ; read root sector of SCSI unit 0
  166. ;    adda.w    #12,sp        ; clean up stack
  167.  
  168. ; Start test
  169.  
  170. w4char:    move.w    #2,-(sp)    ; console
  171.     move.w    #1,-(sp)    ; Bconstat(CON)
  172.     trap    #13
  173.     addq.w    #4,sp        ; clean up stack
  174.     tst.w    d0        ; any character available?
  175.     bne    getchar        ; if so, go get it
  176.                 ; else
  177.     tst.b    rw        ; do read write test?
  178.     bne.s    wtst        ; if so, go do it
  179.     tst.b    idespin        ; do IDE spin-up?
  180.     beq.s    chkblit        ; if not, test blit?
  181.     bsr    idespnup    ; else spin IDE up
  182. chkblit:
  183.     tst.b    blit        ; do blit test?
  184.     beq.s    w4char        ; if not, fine
  185.     bsr    blittst        ; else, do it
  186.     tst.b    badblit        ; blit test successful?
  187.     beq.s    w4char        ; if so, then continue
  188.     move.l    #e_blit,-(sp)    ; print error message
  189.     bsr    prnstr
  190.     addq.w    #4,sp        ; clean up stack
  191.     sf    blit        ; disable BLiT test
  192.     bra    w4char
  193.  
  194. wtst:    tst.b    blit        ; BLiT test on?
  195.     beq.s    stcap        ; if not, good, just go on
  196.     st    manual        ; if so, remember it
  197.     sf    blit        ; and turn it off while getting capacity
  198. stcap:    move.l    #bdbuf,-(sp)    ; buffer
  199.     clr.l    -(sp)        ; sectnum
  200.     clr.w    -(sp)        ; pmi = 0
  201.     move.w    #8,-(sp)    ; SCSI 0
  202.     bsr    _readcap
  203.     add.l    #12,sp        ; clean up stack
  204.     tst.b    manual        ; did we turned BLiT test off?
  205.     beq.s    tstcap        ; if not, just go on
  206.     st    blit        ; else, put it back on
  207.     sf    manual
  208. tstcap:    tst.w    d0        ; successful?
  209.     beq.s    getcap        ; if so, get capacity of drive
  210.     move.l    #e_cap,-(sp)    ; else print error message
  211.     bsr    prnstr
  212.     addq.w    #4,sp        ; clean up stack
  213.     sf    rw        ; disable read write test
  214.     bra    w4char        ; if not, quit
  215.  
  216. getcap:    move.l    bdbuf,d0    ; d0 = hard disk size
  217.     addq.l    #1,d0        ;    = logical address of last block + 1
  218.     sub.l    #NSECTS,d0    ; d0 = starting sector for r/w test
  219.     move.l    d0,ssect    ; save starting sector for r/w test
  220.  
  221.     move.w    #8,-(sp)    ; SCSI unit 0
  222.     move.l    bigwbuf,-(sp)    ; buffer
  223.     move.w    #NSECTS,-(sp)    ; NSECTS sectors
  224.     move.l    ssect,-(sp)    ; sector #
  225.     bsr    _hwrite        ; write test pattern onto disk
  226.     adda.w    #12,sp        ; clean up stack
  227.     tst.w    d0        ; successful?
  228.     beq.s    rtst        ; if so, go on
  229.     move.l    #e_write,-(sp)    ; print error message
  230.     bsr    prnstr
  231.     addq.w    #4,sp        ; clean up stack
  232.     sf    rw        ; disable read-write test
  233.     bra    w4char
  234.  
  235. rtst:    tst.b    blit        ; blit test done?
  236.     beq.s    rtst1        ; if not, no need to check
  237.     tst.b    badblit        ; blit test successful?
  238.     beq.s    rtst1        ; if so, then continue
  239.     move.l    #e_blit,-(sp)    ; else print error message
  240.     bsr    prnstr
  241.     addq.w    #4,sp        ; clean up stack
  242.     sf    blit        ; disable BLiT test
  243.     bra    w4char
  244.  
  245. rtst1:    move.w    #8,-(sp)    ; SCSI unit 0
  246.     move.l    bigrbuf,-(sp)    ; buffer
  247.     move.w    #NSECTS,-(sp)    ; NSECTS sectors
  248.     move.l    ssect,-(sp)    ; sector 0
  249.     bsr    _hread        ; read test pattern back from disk
  250.     adda.w    #12,sp        ; clean up stack
  251.     tst.w    d0        ; successful?
  252.     beq.s    cmptst        ; if so, go on
  253.     move.l    #e_read,-(sp)    ; print error message
  254.     bsr    prnstr
  255.     addq.w    #4,sp        ; clean up stack
  256.     sf    rw        ; disable read-write test
  257.     bra    w4char
  258.  
  259. cmptst:    tst.b    blit        ; blit test done?
  260.     beq.s    cmptst1        ; if not, no need to check
  261.     tst.b    badblit        ; blit test successful?
  262.     beq.s    cmptst1        ; if so, then continue
  263.     move.l    #e_blit,-(sp)    ; else print error message
  264.     bsr    prnstr
  265.     addq.w    #4,sp        ; clean up stack
  266.     sf    blit        ; disable blit test
  267.     bra    w4char
  268.  
  269. cmptst1:
  270.     movea.l    bigwbuf,a0    ; a0 -> write buffer
  271.     movea.l    bigrbuf,a1    ; a1 -> write buffer
  272.     move.w    #NSECTS-1,d1    ; altogether NSECTS sectors
  273. cnxts:    move.w    #127,d2        ; 128 longs per sector
  274. cnxtb:    cmpm.l    (a0)+,(a1)+
  275.     dbne    d2,cnxtb    ; compare next byte
  276.     dbne    d1,cnxts    ; compare next sector
  277.     beq    w4char        ; if data match, continue
  278.     move.l    #e_rwcmp,-(sp)    ; else print error message
  279.     bsr    prnstr
  280.     addq.w    #4,sp        ; clean up stack
  281.     sf    rw        ; disable read-write test
  282.     bra    w4char        ; and continue
  283.  
  284. getchar:
  285.     move.w    #2,-(sp)    ; console
  286.     move.w    #2,-(sp)    ; Bconin(CON)
  287.     trap    #13
  288.     addq.w    #4,sp        ; clean up stack
  289.  
  290. ;+
  291. ; Keyboard input related to quitting and help
  292. ;-
  293.     cmp.w    #$1b,d0        ; char ESC?
  294.     beq    endtst        ; if so, quit test
  295.  
  296. chk_h:    cmp.w    #'h',d0        ; char h?
  297.     bne.s    chk_r        ; if not, check for char r
  298.     move.l    #cmd,-(sp)    ; else print commands usage
  299.     bsr    prnstr
  300.     addq.w    #4,sp        ; clean up stack
  301.     bra    w4char
  302.  
  303. ;+
  304. ; Keyboard input related to sound
  305. ;-
  306. chk_r:    cmp.w    #'r',d0        ; char r? 
  307.     bne.s    chk_d        ; if not, check for char d
  308.     bsr    insnd        ; else program sound source from internal
  309.     bra    w4char
  310.  
  311. ;chk_o:    cmp.w    #'o',d0        ; char o? 
  312. ;    bne.s    chk_d        ; if not, check for char d
  313. ;    bsr    outsnd        ; else program sound source from internal
  314. ;    bra    w4char
  315.  
  316. chk_d:    cmp.w    #'d',d0        ; char d?
  317.     bne.s    chk_e        ; if not, check for char e
  318.     bsr    dsrcply        ; else disable record-play loop
  319.     bra    w4char
  320.  
  321. chk_e:    cmp.w    #'e',d0        ; char e?
  322.     bne.s    chk_b        ; if not, check for char b
  323.     bsr    enrcply        ; else enable record-play loop
  324.     bra    w4char
  325.  
  326. ;+
  327. ; Keyboard input related to BLiTTER
  328. ;-
  329. chk_b:    cmp.w    #'b',d0        ; char b?
  330.     bne.s    chk_n        ; if not, check for char n
  331.     st    blit        ; else enable BLiTs test
  332.     bra    w4char
  333.  
  334. chk_n:    cmp.w    #'n',d0        ; char n?
  335.     bne.s    chk_w        ; if not, check for char w
  336.     sf    blit        ; else disable BLiT test
  337.     bra    w4char
  338.  
  339. ;+
  340. ; Keyboard input related to read-write
  341. ;-
  342. chk_w:    cmp.w    #'w',d0        ; char w?
  343.     bne.s    chk_q        ; if not, check for char q
  344.     st    rw        ; else enable read write test
  345.     bra    w4char
  346.  
  347. chk_q:    cmp.w    #'q',d0        ; char q?
  348.     bne    chk_u        ; if not, check for char u
  349.     sf    rw        ; else disable read write test
  350.     bra    w4char
  351.  
  352. ;+
  353. ; Keyboard input related to IDE
  354. ;-
  355. chk_u:    cmp.w    #'u',d0        ; char u?
  356.     bne.s    chk_s        ; if not, check for char s
  357.     st    idespin        ; else enable IDE spin-down spin-up
  358.     bra    w4char
  359.  
  360. chk_s:    cmp.w    #'s',d0        ; char s?
  361.     bne.s    nomatch        ; if not, there's no match
  362.     sf    idespin        ; else disable IDE spin-down spin-up
  363.     bra    w4char
  364.  
  365. nomatch:            ; key input doesn't match
  366.     move.l    #help,-(sp)    ; tell user to get help
  367.     bsr    prnstr
  368.     addq.w    #4,sp        ; clean up stack
  369.     bra    w4char
  370.  
  371. endtst:    bsr    dsrcply        ; disable record-play
  372.     tst.l    bigrbuf        ; any buffer allocated?
  373.     beq.s    allout
  374.     move.l    bigrbuf,-(sp)
  375.     move.w    #$49,-(sp)    ; Mfree(bigrbuf)
  376.     trap    #1
  377.     adda.w    #6,sp        ; clean up stack
  378. allout:    move.l    savssp,-(sp)    ; go back to user mode
  379.     move.w    #$20,-(sp)    ; Super(savssp)
  380.     trap    #1
  381.     addq.w    #6,sp
  382.  
  383.     clr.w    -(sp)
  384.     trap    #1        ; Pterm0()
  385.  
  386.  
  387. ;+
  388. ; Set up sound control and mode registers
  389. ;-
  390. sndsetup:
  391.     moveq    #0,d0            ; clear d0
  392.     move.b    VID_BH,d0        ; d0 = screen base address
  393.     swap    d0
  394.     move.b    VID_BM,d0
  395.     lsl.w    #8,d0
  396.     move.b    VID_BL,d0
  397.     move.l    d0,d1            ; d1 = screen base address
  398.  
  399. ; Set up Sound Control Register
  400.                     
  401.     move.b    #REC_SET,SNDCTRL    ; set up RECORD registers
  402.     move.b    d0,SFBLOW        ; set sound frame base address
  403.     lsr.l    #8,d0
  404.     move.b    d0,SFBMID
  405.     lsr.l    #8,d0
  406.     move.b    d0,SFBHI
  407.  
  408.     move.l    d1,d0
  409.     add.l    #$2000,d0        ; frame is $2000 bytes big
  410.     move.l    d0,d1
  411.     move.b    d0,SFTLOW        ; set sound frame top addr
  412.     lsr.l    #8,d0
  413.     move.b    d0,SFTMID
  414.     lsr.l    #8,d0
  415.     move.b    d0,SFTHI
  416.  
  417.                     ; Play back buf follows Record buf
  418.     move.b    #PLAY_SET,SNDCTRL   ; set up PLAY BACK registers
  419.     move.l    d1,d0
  420.     move.b    d0,SFBLOW        ; set sound frame base address
  421.     lsr.l    #8,d0
  422.     move.b    d0,SFBMID
  423.     lsr.l    #8,d0
  424.     move.b    d0,SFBHI
  425.  
  426.     move.l    d1,d0
  427.     add.l    #$2000,d0        ; frame is $2000 bytes big
  428.     move.b    d0,SFTLOW        ; set sound frame top addr
  429.     lsr.l    #8,d0
  430.     move.b    d0,SFTMID
  431.     lsr.l    #8,d0
  432.     move.b    d0,SFTHI
  433.  
  434.     bsr    insnd            ; program sound source
  435.     rts
  436.  
  437.  
  438. ;+
  439. ; Disable record-play loop  (= LT's disable_loop)
  440. ;-
  441. dsrcply:
  442.     clr.b    SNDCTRL
  443.     rts
  444.  
  445.  
  446. ;+
  447. ; Enable record-play loop   (= LT's enable_loop)
  448. ;-
  449. enrcply:
  450.     move.b    #(REC_REP|REC_ENABLE),SNDCTRL
  451.     move.b    #(REC_REP|REC_ENABLE|PLAY_REP|PLAY_ENABLE),SNDCTRL
  452.     rts
  453.  
  454.  
  455. ;+
  456. ; Program sound record data to come from connector (= LT's outer_loop)
  457. ;-
  458. outsnd:    bsr    dsrcply            ; disable rec-play loop
  459.     move.w    #(M_CHAN_OFF|A_CHAN_5|WORD_MODE|S_RT_160),SNDMODE
  460.     move.w    #$ffe0,UWMASK        ; set up uwire mask
  461.     move.w    #$b960,UWDATA        ; set up uwire data
  462.     bsr    enrcply            ; enable rec-play loop
  463.     rts
  464.  
  465.  
  466. ;+
  467. ; Program sound record data to come from RASCAL (= LT's inner_loop)
  468. ;-
  469. insnd:    bsr    dsrcply            ; disable rec-play loop
  470.     move.w    #(WORD_MODE|S_RT_160),SNDMODE
  471.     move.w    #5,CLKSRC        ; clock source, turn off handshake
  472.     move.w    #1,DATAMTRX        ; rec-play loopback - no handshake
  473.  
  474. ; July 2 92 - There is no more RASCAL!!!!!  :)
  475. ;    move.w    #$ffe0,UWMASK        ; set up uwire mask
  476. ;    move.w    #$b920,UWDATA        ; set up uwire data
  477.     bsr    enrcply            ; enable rec-play loop
  478.     rts
  479.  
  480.  
  481. ;+
  482. ; Move data through BLiTTER and check if data is good
  483. ; var badblit = 1 if there is error in data
  484. ; var badblit = 0 if there is no error in data
  485. ;-
  486.     .globl    blittst
  487. blittst:
  488.     movem.l    d0/a0-a1,-(sp)        ; save registers
  489.     lea    bBLiTTER,a1        ; a1 -> BLiTTER register map
  490.     move.l    #bsbuf,SRCADDR(a1)    ; set source addr
  491.     move.l    #bdbuf,DESTADDR(a1)    ; set destination addr
  492.     move.w    #2,DESTXINC(a1)        ; words read
  493.     move.w    #2,SRCXINC(a1)        ; words write
  494.     moveq    #0,d0
  495.     move.w    d0,SRCYINC(a1)        ; never increment source Y
  496.     move.w    d0,DESTYINC(a1)        ; never increment destination Y
  497.     move.b    d0,SKEW(a1)        ; no skew
  498.     moveq    #$ff,d0
  499.     move.l    d0,ENDMASK1(a1)        ; change all bits at destination
  500.     move.w    d0,ENDMASK3(a1)        ; change all bits at destination
  501.     move.w    #$203,HOP(a1)        ; set HOP and OP to source
  502.     move.w    #256,XCNT(a1)        ; num of words to transfer
  503.     move.w    #1,YCNT(a1)        ; one destination line
  504.     move.b    #$80,BUSY(a1)        ; start the BLiTTER
  505. restart:
  506.     nop
  507.     tas    BUSY(a1)        ; restart BLiTTER and test if busy
  508.     bmi.s    restart            ; done if not busy
  509.  
  510.     lea    bsbuf,a0        ; a0 -> source buffer
  511.     lea    bdbuf,a1        ; a1 -> destination buffer
  512.     move.l    #127,d0            ; 128 bytes to check
  513. bcmp:    cmpm.l    (a0)+,(a1)+
  514.     dbne    d0,bcmp
  515.     sne    badblit            ; set result
  516.     movem.l    (sp)+,d0/a0-a1        ; restore registers
  517.     rts
  518.  
  519.  
  520. ;+
  521. ; Idespdn() - spin down IDE drive every 6 secs
  522. ;
  523. ;-
  524.     .globl    idespnup
  525. idespnup:
  526.     move.l    d0,-(sp)        ; save d0
  527.     move.l    _hz_200,d0        ; d0 = current time
  528.     sub.l    timestamp,d0        ; d0 = time interval between now
  529.                     ;      and last time it was spun up
  530.     cmp.w    #NTICKS,d0        ; is it time to spin up again?
  531.     bcs    nospnup            ; if not, return
  532.     move.w    #$10,-(sp)        ; spin up
  533.     bsr    _active            ; set drive to Active mode
  534.     addq.w    #2,sp            ; clean up stack
  535.     move.l    _hz_200,timestamp    ; record new time
  536. nospnup:
  537.     move.l    (sp)+,d0        ; restore d0
  538.     rts
  539.  
  540.  
  541.     
  542. ;+
  543. ; Prnstr() - print the null-terminated string at the given address
  544. ;         to the console
  545. ;
  546. ; Passed:
  547. ;    4(sp).l -> string to be printed
  548. ;-
  549. prnstr:    move.l    4(sp),-(sp)        ; string to be printed
  550.     move.w    #9,-(sp)        ; Cconws()
  551.     trap    #1
  552.     addq.l    #6,sp            ; clean up stack
  553.     rts
  554.  
  555.  
  556.  
  557.